import axios from 'axios'
import 'element-plus/theme-chalk/index.css'
import { ElMessage } from 'element-plus'
// 如果需要路由跳转，直接导入路由实例
import router from '@/router'

const TIME_OUT = 9999999999
const BASE_URL = import.meta.env.VITE_BASE_API

// 1. 创建新的axios实例，
const service = axios.create({
  // 超时时间 单位是ms，这里设置了3s的超时时间
  timeout: TIME_OUT,
  baseURL: BASE_URL,
  // 500错误
  validateStatus: function(status) {
    return status <= 999
  }
})

const serviceshed = []
const requestTimestamps = new Map()

// 2.请求拦截器
service.interceptors.request.use(
  (config) => {
    const now = Date.now()
    const lastRequestTime = requestTimestamps.get(config.url)
    
    // 如果同一个URL在200ms内重复请求，则拒绝（缩短时间窗口）
    if (isExist(config.url) && lastRequestTime && (now - lastRequestTime) < 200) {
      console.warn(`重复请求被阻止: ${config.url}`)
      return Promise.reject('重复请求!')
    }
    
    serviceshed.push(config.url)
    requestTimestamps.set(config.url, now)
    
    // 只有在不是FormData的情况下才设置Content-Type
    if (!(config.data instanceof FormData)) {
      config.headers = {
        'Content-Type': 'application/json;charset=UTF-8'
      }
    }
    
    // 检查是否需要token
    const token = localStorage?.getItem('token')
    if (config.setting?.isToken !== false) {
      if (token) {
        config.headers = config.headers || {}
        config.headers['Authorization'] = token
      } else if (config.url && !config.url.includes('/login') && !config.url.includes('/register')) {
        console.warn('Token not found, redirecting to login')
        router.push('/login')
        return Promise.reject(new Error('未登录'))
      }
    }
    
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  (config) => {
    removeShed(config.config.url)

    if (config?.config?.setting?.responseType) {
      return config
    }
    if (config.status === 500) {
      // 检查是否是token无效的错误
      if (config.data && (config.data.msg === 'token无效' || config.data.msg === '未提供token' || config.data.msg === 'token已过期')) {
        // 清除本地存储的token和用户信息
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')

        // 显示错误消息
        ElMessage.error('登录已过期，请重新登录')

        // 跳转到登录页面
        router.push('/login')

        return Promise.reject(new Error('token无效'))
      } else {
        // 其他500错误的处理
        ElMessage.error(config.data?.msg || '服务器内部错误')
        return Promise.reject(new Error(config.data?.msg || '服务器内部错误'))
      }
    }
    if (config.status === 403) {
      ElMessage.error(config.data?.msg || '权限不足')
      return Promise.reject(new Error(config.data?.msg || '权限不足'))
    }
    return config.data || {}
  },
  (error) => {
    // 确保在错误情况下也移除请求记录
    if (error.config && error.config.url) {
      removeShed(error.config.url)
    }
    
    // 网络错误处理
    if (error.code === 'ECONNABORTED') {
      ElMessage.error('请求超时，请检查网络连接')
    } else if (error.message && error.message.includes('Network Error')) {
      ElMessage.error('网络连接失败，请检查网络')
    }
    return Promise.reject(error)
  }
)

const isExist = (url) => {
  return serviceshed.find((ele) => ele == url)
}

const removeShed = (url) => {
  const index = serviceshed.findIndex((ele) => ele == url)
  if (index !== -1) {
    serviceshed.splice(index, 1)
  }
  // 同时清理时间戳
  requestTimestamps.delete(url)
}

// 4.导入文件
export default service
